package model.aop.demo.demo.utils;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 如何使用动态代理
 * 第一步:写一个动态代理类实现InvocationHandler接口
 * 第二步:获取代理的对象
 */
public class DbProxy implements InvocationHandler {
    //第二步:获取代理对象
    private  Object target;//代理对象
    /**
     *ClassLoader loader, 获取类加载器
     * Class<?>[] interfaces, 获取代理的所有接口
     * InvocationHandler h   InvocationHandler
     */
    public Object  newProxyInstance(Object object){
        this.target =object;
        return Proxy.newProxyInstance(object.getClass().getClassLoader(),
                object.getClass().getInterfaces(),this);
    }

    /**
     * 代理类核心方法
     * @param proxy  被代理对象
     * @param method  被代理方法
     * @param args
     * @return
     * @throws Throwable
     */
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("222");
        Object invoke = method.invoke(target, args);
        System.out.println(invoke);
        return invoke;
    }
}
